home *** CD-ROM | disk | FTP | other *** search
- ;;; gnus-cus.el --- User friendly customization of Gnus
- ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
- ;;
- ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
- ;; Keywords: help, news
- ;; Version: 0.1
-
- ;; This file is part of GNU Emacs.
-
- ;; GNU Emacs is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation; either version 2, or (at your option)
- ;; any later version.
-
- ;; GNU Emacs is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
-
- ;; You should have received a copy of the GNU General Public License
- ;; along with GNU Emacs; see the file COPYING. If not, write to the
- ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- ;; Boston, MA 02111-1307, USA.
-
- ;;; Commentary:
-
- ;;; Code:
-
- (require 'custom)
- (require 'gnus-ems)
- (require 'browse-url)
- (eval-when-compile (require 'cl))
-
- ;; The following is just helper functions and data, not meant to be set
- ;; by the user.
- (defun gnus-make-face (color)
- ;; Create entry for face with COLOR.
- (custom-face-lookup color nil nil nil nil nil))
-
- (defvar gnus-face-light-name-list
- '("light blue" "light cyan" "light yellow" "light pink"
- "pale green" "beige" "orange" "magenta" "violet" "medium purple"
- "turquoise"))
-
- (defvar gnus-face-dark-name-list
- (list
- ;; Not all servers have dark blue in rgb.txt.
- (if (and (eq window-system 'x) (x-color-defined-p "dark blue"))
- "dark blue"
- "royal blue")
- "firebrick" "dark green" "OrangeRed"
- "dark khaki" "dark violet" "SteelBlue4"))
- ; CornflowerBlue SeaGreen OrangeRed SteelBlue4 DeepPink3
- ; DarkOlviveGreen4
-
- (custom-declare '()
- '((tag . "Gnus")
- (doc . "\
- The coffee-brewing, all singing, all dancing, kitchen sink newsreader.")
- (type . group)
- (data
- ((tag . "Visual")
- (doc . "\
- Gnus can be made colorful and fun or grey and dull as you wish.")
- (type . group)
- (data
- ((tag . "Visual")
- (doc . "Enable visual features.
- If `visual' is disabled, there will be no menus and few faces. Most of
- the visual customization options below will be ignored. Gnus will use
- less space and be faster as a result.")
- (default .
- (summary-highlight group-highlight
- article-highlight
- mouse-face
- summary-menu group-menu article-menu
- tree-highlight menu highlight
- browse-menu server-menu
- page-marker tree-menu binary-menu pick-menu
- grouplens-menu))
- (name . gnus-visual)
- (type . sexp))
- ((tag . "WWW Browser")
- (doc . "\
- WWW Browser to call when clicking on an URL button in the article buffer.
-
- You can choose between one of the predefined browsers, or `Other'.")
- (name . browse-url-browser-function)
- (calculate . (cond ((boundp 'browse-url-browser-function)
- browse-url-browser-function)
- ((fboundp 'w3-fetch)
- 'w3-fetch)
- ((eq window-system 'x)
- 'gnus-netscape-open-url)))
- (type . choice)
- (data
- ((tag . "W3")
- (type . const)
- (default . w3-fetch))
- ((tag . "Netscape")
- (type . const)
- (default . browse-url-netscape))
- ((prompt . "Other")
- (doc . "\
- You must specify the name of a Lisp function here. The lisp function
- should open a WWW browser when called with an URL (a string).
- ")
- (default . __uninitialized__)
- (type . symbol))))
- ((tag . "Mouse Face")
- (doc . "\
- Face used for group or summary buffer mouse highlighting.
- The line beneath the mouse pointer will be highlighted with this
- face.")
- (name . gnus-mouse-face)
- (calculate . (condition-case ()
- (if (gnus-visual-p 'mouse-face 'highlight)
- (if (boundp 'gnus-mouse-face)
- gnus-mouse-face
- 'highlight)
- 'default)
- (error 'default)))
- (type . face))
- ((tag . "Article Display")
- (doc . "Controls how the article buffer will look.
-
- If you leave the list empty, the article will appear exactly as it is
- stored on the disk. The list entries will hide or highlight various
- parts of the article, making it easier to find the information you
- want.")
- (name . gnus-article-display-hook)
- (type . list)
- (calculate
- . (if (and (string-match "xemacs" emacs-version)
- (featurep 'xface))
- '(gnus-article-hide-headers-if-wanted
- gnus-article-hide-boring-headers
- gnus-article-treat-overstrike
- gnus-article-maybe-highlight
- gnus-article-display-x-face)
- '(gnus-article-hide-headers-if-wanted
- gnus-article-hide-boring-headers
- gnus-article-treat-overstrike
- gnus-article-maybe-highlight)))
- (data
- ((type . repeat)
- (header . nil)
- (data
- (tag . "Filter")
- (type . choice)
- (data
- ((tag . "Treat Overstrike")
- (doc . "\
- Convert use of overstrike into bold and underline.
-
- Two identical letters separated by a backspace are displayed as a
- single bold letter, while a letter followed by a backspace and an
- underscore will be displayed as a single underlined letter. This
- technique was developed for old line printers (think about it), and is
- still in use on some newsgroups, in particular the ClariNet
- hierarchy.
- ")
- (type . const)
- (default .
- gnus-article-treat-overstrike))
- ((tag . "Word Wrap")
- (doc . "\
- Format too long lines.
- ")
- (type . const)
- (default . gnus-article-word-wrap))
- ((tag . "Remove CR")
- (doc . "\
- Remove carriage returns from an article.
- ")
- (type . const)
- (default . gnus-article-remove-cr))
- ((tag . "Display X-Face")
- (doc . "\
- Look for an X-Face header and display it if present.
-
- See also `X Face Command' for a definition of the external command
- used for decoding and displaying the face.
- ")
- (type . const)
- (default . gnus-article-display-x-face))
- ((tag . "Unquote Printable")
- (doc . "\
- Transform MIME quoted printable into 8-bit characters.
-
- Quoted printable is often seen by strings like `=EF' where you would
- expect a non-English letter.
- ")
- (type . const)
- (default .
- gnus-article-de-quoted-unreadable))
- ((tag . "Universal Time")
- (doc . "\
- Convert date header to universal time.
- ")
- (type . const)
- (default . gnus-article-date-ut))
- ((tag . "Local Time")
- (doc . "\
- Convert date header to local timezone.
- ")
- (type . const)
- (default . gnus-article-date-local))
- ((tag . "Lapsed Time")
- (doc . "\
- Replace date header with a header showing the articles age.
- ")
- (type . const)
- (default . gnus-article-date-lapsed))
- ((tag . "Highlight")
- (doc . "\
- Highlight headers, citations, signature, and buttons.
- ")
- (type . const)
- (default . gnus-article-highlight))
- ((tag . "Maybe Highlight")
- (doc . "\
- Highlight headers, signature, and buttons if `Visual' is turned on.
- ")
- (type . const)
- (default .
- gnus-article-maybe-highlight))
- ((tag . "Highlight Some")
- (doc . "\
- Highlight headers, signature, and buttons.
- ")
- (type . const)
- (default . gnus-article-highlight-some))
- ((tag . "Highlight Headers")
- (doc . "\
- Highlight headers as specified by `Article Header Highlighting'.
- ")
- (type . const)
- (default .
- gnus-article-highlight-headers))
- ((tag . "Highlight Signature")
- (doc . "\
- Highlight the signature as specified by `Article Signature Face'.
- ")
- (type . const)
- (default .
- gnus-article-highlight-signature))
- ((tag . "Citation")
- (doc . "\
- Highlight the citations as specified by `Citation Faces'.
- ")
- (type . const)
- (default .
- gnus-article-highlight-citation))
- ((tag . "Hide")
- (doc . "\
- Hide unwanted headers, excess citation, and the signature.
- ")
- (type . const)
- (default . gnus-article-hide))
- ((tag . "Hide Headers If Wanted")
- (doc . "\
- Hide headers, but allow user to display them with `t' or `v'.
- ")
- (type . const)
- (default .
- gnus-article-hide-headers-if-wanted))
- ((tag . "Hide Headers")
- (doc . "\
- Hide unwanted headers and possibly sort them as well.
- Most likely you want to use `Hide Headers If Wanted' instead.
- ")
- (type . const)
- (default . gnus-article-hide-headers))
- ((tag . "Hide Signature")
- (doc . "\
- Hide the signature.
- ")
- (type . const)
- (default . gnus-article-hide-signature))
- ((tag . "Hide Excess Citations")
- (doc . "\
- Hide excess citation.
-
- Excess is defined by `Citation Hide Percentage' and `Citation Hide Absolute'.
- ")
- (type . const)
- (default .
- gnus-article-hide-citation-maybe))
- ((tag . "Hide Citations")
- (doc . "\
- Hide all cited text.
- ")
- (type . const)
- (default . gnus-article-hide-citation))
- ((tag . "Add Buttons")
- (doc . "\
- Make URL's into clickable buttons.
- ")
- (type . const)
- (default . gnus-article-add-buttons))
- ((prompt . "Other")
- (doc . "\
- Name of Lisp function to call.
-
- Push the `Filter' button to select one of the predefined filters.
- ")
- (type . symbol)))))))
- ((tag . "Article Button Face")
- (doc . "\
- Face used for highlighting buttons in the article buffer.
-
- An article button is a piece of text that you can activate by pressing
- `RET' or `mouse-2' above it.")
- (name . gnus-article-button-face)
- (default . bold)
- (type . face))
- ((tag . "Article Mouse Face")
- (doc . "\
- Face used for mouse highlighting in the article buffer.
-
- Article buttons will be displayed in this face when the cursor is
- above them.")
- (name . gnus-article-mouse-face)
- (default . highlight)
- (type . face))
- ((tag . "Article Signature Face")
- (doc . "\
- Face used for highlighting a signature in the article buffer.")
- (name . gnus-signature-face)
- (default . italic)
- (type . face))
- ((tag . "Article Header Highlighting")
- (doc . "\
- Controls highlighting of article header.
-
- Below is a list of article header names, and the faces used for
- displaying the name and content of the header. The `Header' field
- should contain the name of the header. The field actually contains a
- regular expression that should match the beginning of the header line,
- but if you don't know what a regular expression is, just write the
- name of the header. The second field is the `Name' field, which
- determines how the the header name (i.e. the part of the header left
- of the `:') is displayed. The third field is the `Content' field,
- which determines how the content (i.e. the part of the header right of
- the `:') is displayed.
-
- If you leave the last `Header' field in the list empty, the `Name' and
- `Content' fields will determine how headers not listed above are
- displayed.
-
- If you only want to change the display of the name part for a specific
- header, specify `None' in the `Content' field. Similarly, specify
- `None' in the `Name' field if you only want to leave the name part
- alone.")
- (name . gnus-header-face-alist)
- (type . list)
- (calculate
- . (cond
- ((not (eq gnus-display-type 'color))
- '(("" bold italic)))
- ((eq gnus-background-mode 'dark)
- (list
- (list "From" nil
- (custom-face-lookup "light blue" nil nil t t nil))
- (list "Subject" nil
- (custom-face-lookup "pink" nil nil t t nil))
- (list "Newsgroups:.*," nil
- (custom-face-lookup "yellow" nil nil t t nil))
- (list
- ""
- (custom-face-lookup "cyan" nil nil t nil nil)
- (custom-face-lookup "forestgreen" nil nil nil t
- nil))))
- (t
- (list
- (list "From" nil
- (custom-face-lookup "MidnightBlue" nil nil t t nil))
- (list "Subject" nil
- (custom-face-lookup "firebrick" nil nil t t nil))
- (list "Newsgroups:.*," nil
- (custom-face-lookup "indianred" nil nil t t nil))
- (list ""
- (custom-face-lookup
- "DarkGreen" nil nil t nil nil)
- (custom-face-lookup "DarkGreen" nil nil
- nil t nil))))))
- (data
- ((type . repeat)
- (header . nil)
- (data
- (type . list)
- (compact . t)
- (data
- ((type . string)
- (prompt . "Header")
- (tag . "Header "))
- "\n "
- ((type . face)
- (prompt . "Name")
- (tag . "Name "))
- "\n "
- ((type . face)
- (tag . "Content"))
- "\n")))))
- ((tag . "Attribution Face")
- (doc . "\
- Face used for attribution lines.
- It is merged with the face for the cited text belonging to the attribution.")
- (name . gnus-cite-attribution-face)
- (default . underline)
- (type . face))
- ((tag . "Citation Faces")
- (doc . "\
- List of faces used for highlighting citations.
-
- When there are citations from multiple articles in the same message,
- Gnus will try to give each citation from each article its own face.
- This should make it easier to see who wrote what.")
- (name . gnus-cite-face-list)
- (import . gnus-custom-import-cite-face-list)
- (type . list)
- (calculate . (cond ((not (eq gnus-display-type 'color))
- '(italic))
- ((eq gnus-background-mode 'dark)
- (mapcar 'gnus-make-face
- gnus-face-light-name-list))
- (t
- (mapcar 'gnus-make-face
- gnus-face-dark-name-list))))
- (data
- ((type . repeat)
- (header . nil)
- (data (type . face)
- (tag . "Face")))))
- ((tag . "Citation Hide Percentage")
- (doc . "\
- Only hide excess citation if above this percentage of the body.")
- (name . gnus-cite-hide-percentage)
- (default . 50)
- (type . integer))
- ((tag . "Citation Hide Absolute")
- (doc . "\
- Only hide excess citation if above this number of lines in the body.")
- (name . gnus-cite-hide-absolute)
- (default . 10)
- (type . integer))
- ((tag . "Summary Selected Face")
- (doc . "\
- Face used for highlighting the current article in the summary buffer.")
- (name . gnus-summary-selected-face)
- (default . underline)
- (type . face))
- ((tag . "Summary Line Highlighting")
- (doc . "\
- Controls the highlighting of summary buffer lines.
-
- Below is a list of `Form'/`Face' pairs. When deciding how a a
- particular summary line should be displayed, each form is
- evaluated. The content of the face field after the first true form is
- used. You can change how those summary lines are displayed, by
- editing the face field.
-
- It is also possible to change and add form fields, but currently that
- requires an understanding of Lisp expressions. Hopefully this will
- change in a future release. For now, you can use the following
- variables in the Lisp expression:
-
- score: The article's score
- default: The default article score.
- below: The score below which articles are automatically marked as read.
- mark: The article's mark.")
- (name . gnus-summary-highlight)
- (type . list)
- (calculate
- . (cond
- ((not (eq gnus-display-type 'color))
- '(((> score default) . bold)
- ((< score default) . italic)))
- ((eq gnus-background-mode 'dark)
- (list
- (cons
- '(= mark gnus-canceled-mark)
- (custom-face-lookup "yellow" "black" nil
- nil nil nil))
- (cons '(and (> score default)
- (or (= mark gnus-dormant-mark)
- (= mark gnus-ticked-mark)))
- (custom-face-lookup
- "pink" nil nil t nil nil))
- (cons '(and (< score default)
- (or (= mark gnus-dormant-mark)
- (= mark gnus-ticked-mark)))
- (custom-face-lookup "pink" nil nil
- nil t nil))
- (cons '(or (= mark gnus-dormant-mark)
- (= mark gnus-ticked-mark))
- (custom-face-lookup
- "pink" nil nil nil nil nil))
-
- (cons
- '(and (> score default) (= mark gnus-ancient-mark))
- (custom-face-lookup "medium blue" nil nil t
- nil nil))
- (cons
- '(and (< score default) (= mark gnus-ancient-mark))
- (custom-face-lookup "SkyBlue" nil nil
- nil t nil))
- (cons
- '(= mark gnus-ancient-mark)
- (custom-face-lookup "SkyBlue" nil nil
- nil nil nil))
- (cons '(and (> score default) (= mark gnus-unread-mark))
- (custom-face-lookup "white" nil nil t
- nil nil))
- (cons '(and (< score default) (= mark gnus-unread-mark))
- (custom-face-lookup "white" nil nil
- nil t nil))
- (cons '(= mark gnus-unread-mark)
- (custom-face-lookup
- "white" nil nil nil nil nil))
-
- (cons '(> score default) 'bold)
- (cons '(< score default) 'italic)))
- (t
- (list
- (cons
- '(= mark gnus-canceled-mark)
- (custom-face-lookup
- "yellow" "black" nil nil nil nil))
- (cons '(and (> score default)
- (or (= mark gnus-dormant-mark)
- (= mark gnus-ticked-mark)))
- (custom-face-lookup "firebrick" nil nil
- t nil nil))
- (cons '(and (< score default)
- (or (= mark gnus-dormant-mark)
- (= mark gnus-ticked-mark)))
- (custom-face-lookup "firebrick" nil nil
- nil t nil))
- (cons
- '(or (= mark gnus-dormant-mark)
- (= mark gnus-ticked-mark))
- (custom-face-lookup
- "firebrick" nil nil nil nil nil))
-
- (cons '(and (> score default) (= mark gnus-ancient-mark))
- (custom-face-lookup "RoyalBlue" nil nil
- t nil nil))
- (cons '(and (< score default) (= mark gnus-ancient-mark))
- (custom-face-lookup "RoyalBlue" nil nil
- nil t nil))
- (cons
- '(= mark gnus-ancient-mark)
- (custom-face-lookup
- "RoyalBlue" nil nil nil nil nil))
-
- (cons '(and (> score default) (/= mark gnus-unread-mark))
- (custom-face-lookup "DarkGreen" nil nil
- t nil nil))
- (cons '(and (< score default) (/= mark gnus-unread-mark))
- (custom-face-lookup "DarkGreen" nil nil
- nil t nil))
- (cons
- '(/= mark gnus-unread-mark)
- (custom-face-lookup "DarkGreen" nil nil
- nil nil nil))
-
- (cons '(> score default) 'bold)
- (cons '(< score default) 'italic)))))
- (data
- ((type . repeat)
- (header . nil)
- (data (type . pair)
- (compact . t)
- (data ((type . sexp)
- (width . 60)
- (tag . "Form"))
- "\n "
- ((type . face)
- (tag . "Face"))
- "\n")))))
-
- ((tag . "Group Line Highlighting")
- (doc . "\
- Controls the highlighting of group buffer lines.
-
- Below is a list of `Form'/`Face' pairs. When deciding how a a
- particular group line should be displayed, each form is
- evaluated. The content of the face field after the first true form is
- used. You can change how those group lines are displayed by
- editing the face field.
-
- It is also possible to change and add form fields, but currently that
- requires an understanding of Lisp expressions. Hopefully this will
- change in a future release. For now, you can use the following
- variables in the Lisp expression:
-
- group: The name of the group.
- unread: The number of unread articles in the group.
- method: The select method used.
- mailp: Whether it's a mail group or not.
- level: The level of the group.
- score: The score of the group.
- ticked: The number of ticked articles.")
- (name . gnus-group-highlight)
- (type . list)
- (calculate
- . (cond
- ((not (eq gnus-display-type 'color))
- '((mailp . bold)
- ((= unread 0) . italic)))
- ((eq gnus-background-mode 'dark)
- `(((and (not mailp) (eq level 1)) .
- ,(custom-face-lookup "PaleTurquoise" nil nil t))
- ((and (not mailp) (eq level 2)) .
- ,(custom-face-lookup "turquoise" nil nil t))
- ((and (not mailp) (eq level 3)) .
- ,(custom-face-lookup "MediumTurquoise" nil nil t))
- ((and (not mailp) (>= level 4)) .
- ,(custom-face-lookup "DarkTurquoise" nil nil t))
- ((and mailp (eq level 1)) .
- ,(custom-face-lookup "aquamarine1" nil nil t))
- ((and mailp (eq level 2)) .
- ,(custom-face-lookup "aquamarine2" nil nil t))
- ((and mailp (eq level 3)) .
- ,(custom-face-lookup "aquamarine3" nil nil t))
- ((and mailp (>= level 4)) .
- ,(custom-face-lookup "aquamarine4" nil nil t))
- ))
- (t
- `(((and (not mailp) (<= level 3)) .
- ,(custom-face-lookup "ForestGreen" nil nil t))
- ((and (not mailp) (eq level 4)) .
- ,(custom-face-lookup "DarkGreen" nil nil t))
- ((and (not mailp) (eq level 5)) .
- ,(custom-face-lookup "CadetBlue4" nil nil t))
- ((and mailp (eq level 1)) .
- ,(custom-face-lookup "DeepPink3" nil nil t))
- ((and mailp (eq level 2)) .
- ,(custom-face-lookup "HotPink3" nil nil t))
- ((and mailp (eq level 3)) .
- ,(custom-face-lookup
- ;; Not all servers have dark magenta in rgb.txt.
- (if (and (eq window-system 'x)
- (x-color-defined-p "dark magenta"))
- "dark magenta"
- "maroon")
- nil nil t))
- ((and mailp (eq level 4)) .
- ,(custom-face-lookup "DeepPink4" nil nil t))
- ((and mailp (> level 4)) .
- ,(custom-face-lookup "DarkOrchid4" nil nil t))
- ))))
- (data
- ((type . repeat)
- (header . nil)
- (data (type . pair)
- (compact . t)
- (data ((type . sexp)
- (width . 60)
- (tag . "Form"))
- "\n "
- ((type . face)
- (tag . "Face"))
- "\n")))))
-
- ;; Do not define `gnus-button-alist' before we have
- ;; some `complexity' attribute so we can hide it from
- ;; beginners.
- )))))
-
- (defun gnus-custom-import-cite-face-list (custom alist)
- ;; Backward compatible grokking of light and dark.
- (cond ((eq alist 'light)
- (setq alist (mapcar 'gnus-make-face gnus-face-light-name-list)))
- ((eq alist 'dark)
- (setq alist (mapcar 'gnus-make-face gnus-face-dark-name-list))))
- (funcall (custom-super custom 'import) custom alist))
-
- (provide 'gnus-cus)
-
- ;;; gnus-cus.el ends here
-